% TODO proof-reading
\subsubsection{Заранее инициализированный массив строк}
\label{Java_2D_array_month}

\begin{lstlisting}[style=customjava]
class Month
{
	public static String[] months = 
	{
		"January", 
		"February", 
		"March", 
		"April",
		"May",
		"June",
		"July",
		"August",
		"September",
		"October",
		"November",
		"December"
	};

	public String get_month (int i)
	{
		return months[i];
	};
} 
\end{lstlisting}




\begin{lstlisting}
  public java.lang.String get_month(int);
    flags: ACC_PUBLIC
    Code:
      stack=2, locals=2, args_size=2
         0: getstatic     #2         // Field months:[Ljava/lang/String;
         3: iload_1       
         4: aaload        
         5: areturn       
\end{lstlisting}


\TT{aaload} работает с массивом \IT{reference}-ов.

Строка в Java это объект, так что используются \IT{a}-инструкции для работы с ними.

\TT{areturn} возвращает \IT{reference} на объект \TT{String}.


Как инициализируется массив \TT{months[]}?

\begin{lstlisting}
  static {};
    flags: ACC_STATIC
    Code:
      stack=4, locals=0, args_size=0
         0: bipush        12
         2: anewarray     #3         // class java/lang/String
         5: dup           
         6: iconst_0      
         7: ldc           #4         // String January
         9: aastore       
        10: dup           
        11: iconst_1      
        12: ldc           #5         // String February
        14: aastore       
        15: dup           
        16: iconst_2      
        17: ldc           #6         // String March
        19: aastore       
        20: dup           
        21: iconst_3      
        22: ldc           #7         // String April
        24: aastore       
        25: dup           
        26: iconst_4      
        27: ldc           #8         // String May
        29: aastore       
        30: dup           
        31: iconst_5      
        32: ldc           #9         // String June
        34: aastore       
        35: dup           
        36: bipush        6
        38: ldc           #10        // String July
        40: aastore       
        41: dup           
        42: bipush        7
        44: ldc           #11        // String August
        46: aastore       
        47: dup           
        48: bipush        8
        50: ldc           #12        // String September
        52: aastore       
        53: dup           
        54: bipush        9
        56: ldc           #13        // String October
        58: aastore       
        59: dup           
        60: bipush        10
        62: ldc           #14        // String November
        64: aastore       
        65: dup           
        66: bipush        11
        68: ldc           #15        // String December
        70: aastore       
        71: putstatic     #2         // Field months:[Ljava/lang/String;
        74: return        
\end{lstlisting}


\TT{anewarray} создает новый массив \IT{reference}-ов (отсюда префикс \IT{a}).

Тип объекта определяется в операнде \TT{anewarray}, там текстовая строка \\
\q{java/lang/String}.

\TT{bipush 12} перед \TT{anewarray} устанавливает размер массива.

Новая для нас здесь инструкция: \TT{dup}.

\myindex{Forth}

Это стандартная инструкция в стековых компьютерах (включая ЯП Forth),
которая делает дубликат значения на \ac{TOS}.
\myindex{x86!\Instructions!FDUP}

Кстати, FPU 80x87 это тоже стековый компьютер, и в нем есть аналогичная инструкция -- \INS{FDUP}.


Она используется здесь для дублирования \IT{reference}-а на массив, 
потому что инструкция \TT{aastore} выталкивает из стека \IT{reference} на массив, 
но последующая инструкция \TT{aastore} снова нуждается в нем.

Компилятор Java решил, что лучше генерировать \TT{dup} вместо генерации инструкции
\TT{getstatic} перед каждой операцией записи в массив (т.е. 11 раз).


\TT{aastore} кладет \IT{reference} (на строку) в массив по индексу взятому из \ac{TOS}.


И наконец, \TT{putstatic} кладет \IT{reference} на только что созданный массив во второе поле
нашего объекта, т.е. в поле \IT{months}.
